home *** CD-ROM | disk | FTP | other *** search
/ Computer Inter@ctive 16 / Computer Interactive cdrom 16 - dic 98.iso / zdnetit / content / CLASSBLD.ZIP / Include / CB_MultiOwned.h < prev    next >
Encoding:
C/C++ Source or Header  |  1998-03-06  |  6.8 KB  |  215 lines

  1. #ifndef CB_MULTI_OWNED_H
  2. #define CB_MULTI_OWNED_H
  3.  
  4. #include "CB_Multi.h"
  5.  
  6. // defines for include files
  7. #define RELATION_MULTI_OWNED_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  8. public:\
  9.     ClassTo* _first##NameTo;\
  10.     ClassTo* _last##NameTo;\
  11.     int _count##NameTo;\
  12. \
  13. protected:\
  14.     void Add##NameTo##First(ClassTo* item);\
  15.     void Add##NameTo##Last(ClassTo* item);\
  16.     void Add##NameTo##After(ClassTo* item, ClassTo* pos);\
  17.     void Add##NameTo##Before(ClassTo* item, ClassTo* pos);\
  18.     void Remove##NameTo(ClassTo* item);\
  19.     void Replace##NameTo(ClassTo* item, ClassTo* newItem);\
  20. \
  21. public:\
  22.     void DeleteAll##NameTo();\
  23.     ClassTo* GetFirst##NameTo();\
  24.     ClassTo* GetLast##NameTo();\
  25.     ClassTo* GetNext##NameTo(ClassTo* pos);\
  26.     ClassTo* GetPrev##NameTo(ClassTo* pos);\
  27.     int Get##NameTo##Count();\
  28.     void Move##NameTo##First(ClassTo* item);\
  29.     void Move##NameTo##Last(ClassTo* item);\
  30.     void Move##NameTo##After(ClassTo* item, ClassTo* pos);\
  31.     void Move##NameTo##Before(ClassTo* item, ClassTo* pos);\
  32.     void Sort##NameTo(int (*comp)(ClassTo*, ClassTo*));\
  33.     ITERATOR_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  34.  
  35. #define RELATION_NOFILTER_MULTI_OWNED_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  36. public:\
  37.     ClassTo* _first##NameTo;\
  38.     ClassTo* _last##NameTo;\
  39.     int _count##NameTo;\
  40. \
  41. protected:\
  42.     void Add##NameTo##First(ClassTo* item);\
  43.     void Add##NameTo##Last(ClassTo* item);\
  44.     void Add##NameTo##After(ClassTo* item, ClassTo* pos);\
  45.     void Add##NameTo##Before(ClassTo* item, ClassTo* pos);\
  46.     void Remove##NameTo(ClassTo* item);\
  47.     void Replace##NameTo(ClassTo* item, ClassTo* newItem);\
  48. \
  49. public:\
  50.     void DeleteAll##NameTo();\
  51.     ClassTo* GetFirst##NameTo();\
  52.     ClassTo* GetLast##NameTo();\
  53.     ClassTo* GetNext##NameTo(ClassTo* pos);\
  54.     ClassTo* GetPrev##NameTo(ClassTo* pos);\
  55.     int Get##NameTo##Count();\
  56.     void Move##NameTo##First(ClassTo* item);\
  57.     void Move##NameTo##Last(ClassTo* item);\
  58.     void Move##NameTo##After(ClassTo* item, ClassTo* pos);\
  59.     void Move##NameTo##Before(ClassTo* item, ClassTo* pos);\
  60.     void Sort##NameTo(int (*comp)(ClassTo*, ClassTo*));\
  61.     ITERATOR_NOFILTER_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  62.  
  63. #define RELATION_MULTI_OWNED_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  64.     RELATION_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  65.  
  66. // defines implementation
  67. #define INIT_MULTI_OWNED_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  68.    INIT_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  69.  
  70. #define EXIT_MULTI_OWNED_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  71.     { for (ClassTo* item = GetFirst##NameTo(); item; item = GetFirst##NameTo())\
  72.           delete item; }
  73.  
  74. #define REPLACE_MULTI_OWNED_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  75.     REPLACE_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  76.  
  77. #define INIT_MULTI_OWNED_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  78.     assert(this);\
  79.     assert(p##NameFrom);\
  80.     p##NameFrom->_count##NameTo++;\
  81. \
  82.     _ref##NameFrom = p##NameFrom;\
  83. \
  84.     if (p##NameFrom->_last##NameTo)\
  85.     {\
  86.         _next##NameFrom = (ClassTo*)0;\
  87.         _prev##NameFrom = p##NameFrom->_last##NameTo;\
  88.         _prev##NameFrom->_next##NameFrom = this;\
  89.         p##NameFrom->_last##NameTo = this;\
  90.     }\
  91.     else\
  92.     {\
  93.         _prev##NameFrom = (ClassTo*)0;\
  94.         _next##NameFrom = (ClassTo*)0;\
  95.         p##NameFrom->_first##NameTo = p##NameFrom->_last##NameTo = this;\
  96.     }
  97.  
  98. #define EXIT_MULTI_OWNED_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  99.     EXIT_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  100.  
  101. #define REPLACE_MULTI_OWNED_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  102.     assert(this);\
  103.     assert(pOld);\
  104.     assert(pOld->_ref##NameFrom);\
  105.     ClassFrom##::##NameTo##Iterator::Check(pOld, this);\
  106. \
  107.     _ref##NameFrom = pOld->_ref##NameFrom;\
  108. \
  109.     if (pOld->_next##NameFrom)\
  110.         pOld->_next##NameFrom->_prev##NameFrom = this;\
  111.     else\
  112.         _ref##NameFrom->_last##NameTo = this;\
  113. \
  114.     if (pOld->_prev##NameFrom)\
  115.         pOld->_prev##NameFrom->_next##NameFrom = this;\
  116.     else\
  117.         _ref##NameFrom->_first##NameTo = this;\
  118. \
  119.     _next##NameFrom = pOld->_next##NameFrom;\
  120.     _prev##NameFrom = pOld->_prev##NameFrom;\
  121. \
  122.     pOld->_ref##NameFrom = (ClassFrom*)0;\
  123.     pOld->_next##NameFrom = (ClassTo*)0;\
  124.     pOld->_prev##NameFrom = (ClassTo*)0;
  125.  
  126. #define METHODS_MULTI_OWNED_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  127. void ClassFrom##::Add##NameTo##First(ClassTo* item)\
  128. {\
  129.     METHOD_MULTI_ADDFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  130. }\
  131. \
  132. void ClassFrom##::Add##NameTo##Last(ClassTo* item)\
  133. {\
  134.     METHOD_MULTI_ADDLAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  135. }\
  136. \
  137. void ClassFrom##::Add##NameTo##After(ClassTo* item, ClassTo* pos)\
  138. {\
  139.     METHOD_MULTI_ADDAFTER(ClassFrom, NameFrom, ClassTo, NameTo) \
  140. }\
  141. \
  142. void ClassFrom##::Add##NameTo##Before(ClassTo* item, ClassTo* pos)\
  143. {\
  144.     METHOD_MULTI_ADDBEFORE(ClassFrom, NameFrom, ClassTo, NameTo) \
  145. }\
  146. \
  147. void ClassFrom##::Remove##NameTo(ClassTo* item)\
  148. {\
  149.     METHOD_MULTI_REMOVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  150. }\
  151. \
  152. void ClassFrom##::DeleteAll##NameTo()\
  153. {\
  154.     METHOD_MULTI_DELETEALL(ClassFrom, NameFrom, ClassTo, NameTo) \
  155. }\
  156. \
  157. void ClassFrom##::Replace##NameTo(ClassTo* item, ClassTo* newItem)\
  158. {\
  159.     METHOD_MULTI_REPLACE(ClassFrom, NameFrom, ClassTo, NameTo) \
  160. }\
  161. \
  162. ClassTo* ClassFrom##::GetFirst##NameTo()\
  163. {\
  164.     METHOD_MULTI_GETFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  165. }\
  166. \
  167. ClassTo* ClassFrom##::GetLast##NameTo()\
  168. {\
  169.     METHOD_MULTI_GETLAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  170. }\
  171. \
  172. ClassTo* ClassFrom##::GetNext##NameTo(ClassTo* pos)\
  173. {\
  174.     METHOD_MULTI_GETNEXT(ClassFrom, NameFrom, ClassTo, NameTo) \
  175. }\
  176. \
  177. ClassTo* ClassFrom##::GetPrev##NameTo(ClassTo* pos)\
  178. {\
  179.     METHOD_MULTI_GETPREV(ClassFrom, NameFrom, ClassTo, NameTo) \
  180. }\
  181. \
  182. int ClassFrom##::Get##NameTo##Count()\
  183. {\
  184.     METHOD_MULTI_GETCOUNT(ClassFrom, NameFrom, ClassTo, NameTo) \
  185. }\
  186. \
  187. void ClassFrom##::Move##NameTo##First(ClassTo* item)\
  188. {\
  189.     METHOD_MULTI_MOVEFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  190. }\
  191. \
  192. void ClassFrom##::Move##NameTo##Last(ClassTo* item)\
  193. {\
  194.     METHOD_MULTI_MOVELAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  195. }\
  196. \
  197. void ClassFrom##::Move##NameTo##After(ClassTo* item, ClassTo* pos)\
  198. {\
  199.     METHOD_MULTI_MOVEAFTER(ClassFrom, NameFrom, ClassTo, NameTo) \
  200. }\
  201. \
  202. void ClassFrom##::Move##NameTo##Before(ClassTo* item, ClassTo* pos)\
  203. {\
  204.     METHOD_MULTI_MOVEBEFORE(ClassFrom, NameFrom, ClassTo, NameTo) \
  205. }\
  206. \
  207. void ClassFrom##::Sort##NameTo##(int (*comp)(ClassTo*, ClassTo*))\
  208. {\
  209.     METHOD_MULTI_SORT(ClassFrom, NameFrom, ClassTo, NameTo) \
  210. }
  211.  
  212. #define METHODS_MULTI_OWNED_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  213.  
  214. #endif
  215.